package wodegua.d26_字符集;

/**
 * 标准ASCII字符集（'0'=48,'a'=97,'A'=65）
 * ASCl(American Standard Code for InformationInterchange):美国信息交换标准代码，包括了英文、符号等。
 * 标准ASCII使用1个字节存储一个字符，首位是0，总共可表示128个字符，对美国佬来说完全够用
 *
 * GBK(汉字编码扩展规范，国标)
 * 汉字编码字符集，包含了2万多个汉字等字符，GBK中一个中文字符编码成两个字节的形式存储。
 * 注意:GBK兼容了ASCII字符集。
 * GBK规定:汉字的第一个字节的第一位必须是1
 * 1xxxxxxx xxxxxxxx 0xxxxxxx 1xxxxxxx xxxxxxxx
 *
 * Unicode字符集(统一码，也叫万国码)
 * Unicode是国际组织制定的，可以容纳世界上所有文字、符号的字符集。
 *
 * UTF-32 我4个字节表示一个字符 有容乃大
 * 奢侈! 占存储空间，通信效率变低!
 *
 * UTF-8
 * 是Unicode字符集的一种编码方案，采取可变长编码方案，共分四个长度区:1个字节，2个字节，3个字节，4个字节
 * 英文字符、数字等只占1个字节(兼容标准ASCII编码)，汉字字符占用3个字节。
 *
 * a我m
 * 01100001 1110xxxx 10xxxxxx 10xxxxxx 01101101
 *
 * UTF-8编码方式(二进制)
 * 0xxxxxxx (ASCII码)
 * 110xxxxx 10xxxxxx
 * 1110xxxxx 10xxxxxx 10xxxxxx
 * 11110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx
 *
 * 注意:技术人员在开发时都应该使用UTF-8编码
 */

import java.util.Arrays;

/**
 * 本节要点
 * ASCII字符集:只有英文、数字、符号等，占1个字节。
 * GBK字符集:汉字占2个字节，英文、数字占1个字节。
 * UTF-8字符集:汉字占3个字节，英文、数字占1个字节
 *
 * 注意1:字符编码时使用的字符集，和解码时使用的字符集必须一致，否则会出现乱码
 * 注意2:英文，数字一般不会乱码，因为很多字符集都兼容了ASCII编码。
 *
 * 读写文本内容更适合用   字符流
 * 适合做数据的转移，如:文件复制等     字节流
 */
public class Test {
    public static void main(String[] args) throws Exception {
        /**
         * Java代码完成对字符的编码
         * String提供了如下方法
         * byte[] getBytes()    使用平台的默认字符集将该 string编码为一系列字节，将结果存储到新的字节数组中
         * byte[] getBytes(string charsetName)  使用指定的字符集将该 string编码为一系列字节，将结果存储到新的字节数组中
         */
        String s = "a我b";
        byte[] bytes = s.getBytes();
        System.out.println(Arrays.toString(bytes));

        byte[] bytes1 = s.getBytes("GBK");
        System.out.println(Arrays.toString(bytes1));

        /**
         * Java代码完成对字符的解码
         * String提供了如下方法
         * string(byte[]bytes)  通过使用平台的默认字符集解码指定的字节数组来构造新的 string
         * String(byte[]bytes,string charsetName)   通过指定的字符集解码指定的字节数组来构造新的string
         */
        System.out.println(new String(bytes));
        System.out.println(new String(bytes1,"GBK"));
    }
}
